/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.comp.mbean;

import com.brain.comp.dto.CotizacionProveedoresDetaDto;
import com.brain.comp.dto.CotizacionProveedoresDto;
import com.brain.comp.dto.DocumentoCompraDto;
import com.brain.comp.dto.PcDetaItemDto;
import com.brain.comp.dto.PedidoCompraDetaDto;
import com.brain.comp.dto.PedidoCompraDto;
import com.brain.comp.dto.SolicitudCompraDetaDto;
import com.brain.comp.dto.SolicitudCompraDto;
import com.brain.comp.manager.CotizacionProveedoresDetaManager;
import com.brain.comp.manager.CotizacionProveedoresManager;
import com.brain.comp.manager.DocumentoCompraManager;
import com.brain.comp.manager.PedidoCompraDetaManager;
import com.brain.comp.manager.PedidoCompraManager;
import com.brain.comp.manager.SolicitudCompraDetaManager;
import com.brain.comp.manager.SolicitudCompraManager;
import com.brain.comp.view.util.ConstantesComp;
import com.brain.conf.dto.AlmacenDto;
import com.brain.conf.dto.CentroCostosDto;
import com.brain.conf.dto.CondicionPagoDto;
import com.brain.conf.dto.MonedaDto;
import com.brain.conf.dto.ProductoDetaDto;
import com.brain.conf.dto.ProductoDto;
import com.brain.conf.dto.TarifaDto;
import com.brain.conf.dto.TerceroDireccionDto;
import com.brain.conf.dto.UnidadMedidaDto;
import com.brain.conf.manager.AlmacenManager;
import com.brain.conf.manager.CentroCostosManager;
import com.brain.conf.manager.CondicionPagoManager;
import com.brain.conf.manager.MonedaManager;
import com.brain.conf.manager.TarifaManager;
import com.brain.conf.manager.UnidadMedidaManager;
import com.brain.conf.mbean.ProductoMBean;
import com.brain.core.common.ExportarExcelCompras;
import com.brain.core.common.ExportarExcelCompras.PedidoCompra;
import com.brain.core.common.UtilCore;
import com.brain.core.configuracion.WebServletContextListener;
import com.brain.core.dto.ParametroDto;
import com.brain.core.view.mbean.*;

import com.brain.core.exception.DAOException;
import com.brain.core.manager.BitacoraManager;
import com.brain.core.manager.OrganizacionManager;
import com.brain.core.manager.RecursosManager;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import javax.faces.model.SelectItem;
import org.apache.log4j.Logger;
import org.primefaces.context.RequestContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

/**
 *
 * @author Indra
 */
@Controller("pedidoCompraMBean")
@Scope("session")
public class PedidoCompraMBean extends GenericMBean implements Serializable {

    private static Logger logger = Logger.getLogger(PedidoCompraMBean.class);
    @Resource
    private PedidoCompraManager manager;
    @Resource
    private OrganizacionManager organizacionManager;
    @Resource
    private SistemaControlCompMBean sistemaControlCompMBean;
    @Resource
    private BitacoraManager bitacoraManager;
    @Resource
    private PedidoCompraDetaManager pedidoCompraDetaManager;
    @Resource
    private ArchivoMBean archivoMBean;
    @Resource
    private RecursosManager recursosManager;
    @Resource
    private UnidadMedidaManager umManager;
    @Resource
    private TarifaManager tarifaManager;
    @Resource
    private SolicitudCompraDetaManager solicitudCompraDetaManager;
    @Resource
    private SolicitudCompraManager solicitudCompraManager;
    @Autowired
    private ApplicationMBean applicationMBean;
    @Resource
    private MonedaManager monedaManager;
    @Autowired
    private SessionMBean sessionMBean;
    @Resource
    private CotizacionProveedoresManager cotizacionManager;
    @Resource
    private CotizacionProveedoresDetaManager cotDetaManager;
    @Resource
    private DocumentoCompraManager dcManager;
    private List<PedidoCompraDto> lista;
    private List<PedidoCompraDto> listaPopup;
    private List<SolicitudCompraDto> listaSolicitudes;
    private PedidoCompraDto dto;
    private PedidoCompraDto dtoFiltro;
    private PedidoCompraDto dtoFiltroPopup;
    private SolicitudCompraDto dtoSolicFiltro;
    private SolicitudCompraDetaDto dtoSolicDetaFiltro;
    private PedidoCompraDetaDto detaDto;
    private String keyEntidad = "key.entidad.pedido.compra";
    private String keyDetalleEntidad = "key.entidad.pedido.compra.deta";
    private String tituloDetalle;
    private SelectItem[] siEstadosFiltro;
    private SelectItem[] siDocTransaccion;
    private SolicitudCompraDetaDto[] selectedSolCompraDetaDto;
    private Date fechaActual;
    private List<UnidadMedidaDto> listaUnidadMedida;
    private List<TarifaDto> listaTarifas;
    private List<MonedaDto> listaMonedas;
    private SolicitudCompraDto solicitudCompraDto;
    private SolicitudCompraDetaDto solCompraDetaDto;
    private List<AlmacenDto> listaAlmacenes;
    private List<ParametroDto> listaFormaPago;
    private List<CondicionPagoDto> listaCondicionPago;
    private List<SolicitudCompraDetaDto> listaItemsSolicitudCompra;
    private Integer contIndex;
    private String urlInvocador;
    private boolean accesoAnulada;
    private boolean accesoConfirmada;
    private boolean accesoRechazada;
    private boolean accesoGuardar;
    private ProductoDto productoDto;
    private ProductoDetaDto productoDetaDto;
    private PedidoCompraDto infoDto;
    private List<PedidoCompraDto> listaNecesidadPedido;
    private PedidoCompraDto[] selectedPCs;
    private ExportarExcelCompras.PedidoCompra pcExcel;
    private String tipoXls;
    private Boolean checkExcel;
    private TerceroDireccionDto terceroDireccionDto;
    private List<CotizacionProveedoresDto> listaCotizaciones;
    private List<CotizacionProveedoresDetaDto> listaDetaCotDto;
    private CotizacionProveedoresDto cotDto;
    private List<DocumentoCompraDto> listaDC;
    private DocumentoCompraDto dcDtoPopup;
    private DocumentoCompraDto dcDto;
    private List<CentroCostosDto> listaCentroCostos;

    public PedidoCompraMBean() {
        this.dtoFiltro = new PedidoCompraDto();
    }

    public String iniciar() {
        this.lista = null;
        this.listaDC = null;
        this.dcDtoPopup = null;
        this.listaCotizaciones = null;
        this.dto = null;
        this.detaDto = null;
        this.listaDetaCotDto = null;
        this.cotDto = null;
        this.dcDto = null;
        this.dtoFiltro = new PedidoCompraDto();
        this.dtoFiltro.setDescProveedor("");
        this.dtoFiltro.setEstado(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_TODOS);
        this.dtoFiltro.setFechaInicio(UtilCore.Fecha.agregarDiasFechaDate(UtilCore.Fecha.obtenerFechaActualDate(), applicationMBean.getRangoFechasBusqueda() * -1));
        this.dtoFiltro.setFechaFin(UtilCore.Fecha.obtenerFechaActualDate());
        this.pcExcel = new ExportarExcelCompras.PedidoCompra(true);
        this.selectedPCs = null;
        return manager.getUrlLista();
    }

    public void iniciarPopup() {
        this.listaPopup = null;
        this.dtoFiltroPopup = new PedidoCompraDto();
        this.dtoFiltroPopup.setDescProveedor("");
        this.dtoFiltroPopup.setEstado(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_CONFIRMADO);
    }

    public String iniciarListaSolicitudes() {
        this.lista = null;
        this.dto = null;
        this.detaDto = null;
        this.dtoSolicFiltro = new SolicitudCompraDto();
        this.dtoSolicFiltro.setDescripcion("");
        this.dtoSolicFiltro.setNombreSolicitante("");
        this.dtoSolicFiltro.setEstado(ConstantesComp.ValoresConstantes.SOL_COMPRA_COD_ESTADO_CONFIRMADA);
        this.listaSolicitudes = null;
        return manager.getUrlListaSolicitudes();
    }

    public String iniciarListaItems() {
        this.listaItemsSolicitudCompra = null;
        this.dtoSolicDetaFiltro = new SolicitudCompraDetaDto();
        this.dtoSolicDetaFiltro.setProductoDetaDto(new ProductoDetaDto());
        this.dtoSolicDetaFiltro.setDescProveedor("");
        this.dtoSolicDetaFiltro.setNombreSolicitante("");
        this.dtoFiltro.setFechaInicio(UtilCore.Fecha.agregarDiasFechaDate(UtilCore.Fecha.obtenerFechaActualDate(), applicationMBean.getRangoFechasBusqueda() * -1));
        this.dtoFiltro.setFechaFin(UtilCore.Fecha.obtenerFechaActualDate());
        this.listaNecesidadPedido = null;
        this.selectedSolCompraDetaDto = null;
        return manager.getUrlNecesidadPedido();
    }

    public String nuevo() {
        sessionMBean.setAccion(applicationMBean.getNuevo());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyEntidad, sessionMBean.getAccion()));
        this.dto = manager.inicializar();
        this.dto.setProviene(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_PROVIENE_MA);
        this.detaDto = this.pedidoCompraDetaManager.inicializar();
        this.urlInvocador = manager.getUrlLista();
        gestionAcceso();
        return manager.getUrl();
    }

    public void nuevoDetalle() {
        sessionMBean.setAccionDetalle(applicationMBean.getNuevo());
        this.tituloDetalle = recursosManager.construirTitulo(keyDetalleEntidad, sessionMBean.getAccionDetalle());
        this.detaDto = this.pedidoCompraDetaManager.inicializar();
        this.detaDto.setPedidoCompraDto(dto);
        //Obtenemos el Item del detalle
        if (!dto.getListaDetalles().isEmpty()) {
            detaDto.setItem(dto.getListaDetalles().size() + 1);
        } else {
            detaDto.setItem(1);
        }
    }

    public String editar() {
        sessionMBean.setAccion(applicationMBean.getEditar());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyEntidad, sessionMBean.getAccion()));
        this.detaDto = this.pedidoCompraDetaManager.inicializar();
        this.urlInvocador = manager.getUrlLista();
        try {
            this.dto = manager.obtenerPorId(this.dto.getId());
            listaDocumentosCompra();
            this.dto.setComentario("");
        } catch (DAOException ex) {
            showError(ex.getMessage());
            logger.error(ex);
        }
        gestionAcceso();
        return manager.getUrl();
    }

    public void editarDetalle() {

        this.tituloDetalle = recursosManager.construirTitulo(keyDetalleEntidad, sessionMBean.getAccionDetalle());
        sessionMBean.setAccionDetalle(applicationMBean.getEditar());
        System.out.println(detaDto.getProductoDetaDto());
        if (this.detaDto.getId() != null) {
            try {
                this.detaDto = pedidoCompraDetaManager.obtenerPorId(this.detaDto.getId());
                this.detaDto.setIsSave(Boolean.TRUE);
            } catch (DAOException ex) {
                showError(ex.getMessage());
                logger.error(ex);
            }
        }
    }

    public String ver() {
        sessionMBean.setAccion(applicationMBean.getVer());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyEntidad, sessionMBean.getAccion()));
        this.detaDto = this.pedidoCompraDetaManager.inicializar();
        this.urlInvocador = manager.getUrlLista();
        try {
            this.dto = manager.obtenerPorId(this.dto.getId());
        } catch (DAOException ex) {
            showError(ex.getMessage());
            logger.error(ex);
        }
        gestionAcceso();
        return manager.getUrl();
    }

    public void verDetalle() {
        this.tituloDetalle = recursosManager.construirTitulo(keyDetalleEntidad, sessionMBean.getAccionDetalle());
        sessionMBean.setAccionDetalle(applicationMBean.getVer());
        if (this.detaDto.getId() != null) {
            try {
                this.detaDto = pedidoCompraDetaManager.obtenerPorId(this.detaDto.getId());
                this.detaDto.setIsSave(Boolean.TRUE);
            } catch (DAOException ex) {
                showError(ex.getMessage());
                logger.error(ex);
            }
        }
    }

    public void buscar() {
        try {
            List<PedidoCompraDto> l = new ArrayList<PedidoCompraDto>();
            this.lista = this.manager.obtener(this.dtoFiltro);
            if (!this.lista.isEmpty()) {
                for (PedidoCompraDto x: this.lista) {                    
                    x.setUltimaModificacion(this.manager.obtenerCadenaUltimaModificacionLista(x));
                    l.add(x);
                }
                this.lista = l;
            }            
        } catch (DAOException ex) {
            showError(ex.getMessage());
            logger.error(ex);
        }
    }

    public void buscarPedidosCompraConfirmados() {
        try {
            this.listaPopup = this.manager.obtenerConfirmados(this.dtoFiltroPopup);
        } catch (DAOException ex) {
            showError("ERROR_SISTEMA", ex.getMessage());
        }
    }

    /**
     * Metodo para buscar Pedido de Compra Confirmados para elaborar una guia de
     * remision
     */
    public void buscarPCConfirmadosParaGuiaRemision() {
        try {
            this.listaPopup = this.manager.obtenerConfirmadosParaGuiaRemision(this.dtoFiltroPopup);
        } catch (DAOException ex) {
            showError("ERROR_SISTEMA", ex.getMessage());
        }
    }

    public void buscarItemsSolicitudCompra() {
        try {
            this.listaItemsSolicitudCompra = this.solicitudCompraDetaManager.obtener(dtoSolicDetaFiltro);
            if (listaNecesidadPedido != null && this.listaItemsSolicitudCompra != null) {
                this.listaItemsSolicitudCompra = manager.quitarItemsYaSeleccionados(this.listaItemsSolicitudCompra, listaNecesidadPedido);
            }
            this.selectedSolCompraDetaDto = null;
        } catch (DAOException ex) {
            showError(ex.getMessage());
            logger.error(ex);
        }
    }

    public String guardar() {
        if (manager.guardar(this.dto) != null) {
            this.editar();
        }
        return null;
    }

    public void guardarDetalles() {
        pedidoCompraDetaManager.guardarDetalles(dto);
    }

    public void guardarDetalle() {
        try {
            if (this.dto.getId() != null) {
                if (pedidoCompraDetaManager.guardar(detaDto) != null) {
                    //Actualizamos la fecha de la ultima modificacion realizada
                    this.dto.setFecha(UtilCore.Fecha.obtenerFechaActualDate());
                    this.manager.guardar(this.dto);
                    //-------------------------------------------------------------------------
                    this.dto = this.manager.obtenerPorId(this.dto.getId());
                }
            } else {
                if (sessionMBean.getAccionDetalle() == applicationMBean.getNuevo()) {
                    this.dto.getListaDetalles().add(this.detaDto);
                }
            }
            this.dto.setSubTotal(this.manager.sumarSubTotalesDetalle(this.dto));
            this.dto = this.manager.recalcularMontos(this.dto);
            if (this.dto.getId() != null) {
                this.manager.editar(dto);
            }
        } catch (DAOException ex) {
            showError(ex.getMessage());
            logger.error(ex);
        }
    }

    public void eliminarDetalle() {
        try {
            if (manager.verificarEliminarDetalle(dto)) {
                detaDto = this.dto.getListaDetalles().get(contIndex.intValue());
                if (detaDto.getId() != null) {
                    pedidoCompraDetaManager.eliminar(detaDto);
                    //Actualizando la fecha de ultima modificacion en el registro
                    this.dto.setFecha(UtilCore.Fecha.obtenerFechaActualDate());
                    this.manager.guardar(this.dto);
                    //----------------------------------------------------------------------
                    this.dto = this.manager.obtenerPorId(this.dto.getId());
                } else {
                    this.dto.getListaDetalles().remove(contIndex.intValue());
                }
                this.dto.setSubTotal(this.manager.sumarSubTotalesDetalle(this.dto));
                this.dto = this.manager.recalcularMontos(this.dto);
                this.manager.reordenarDetalles(dto);
                if (this.dto.getId() != null) {
                    this.manager.editar(dto);
                }
            }
        } catch (DAOException ex) {
            showError(ex.getMessage());
            logger.error(ex);
        }
    }

    public String verBitacora() {

        bitacoraManager.cargarBitacoraEntidad(manager.getIdEntidad(), this.dto.getId());
        return null;
    }

    public String verBitacoraDetalle() {
        bitacoraManager.cargarBitacoraEntidad(pedidoCompraDetaManager.getIdEntidad(), this.detaDto.getId());
        return null;
    }

    public String verArchivos() {
        sessionMBean.setEntidad(manager.getIdEntidad());
        sessionMBean.setRegistro(this.dto.getId());
        archivoMBean.cargarArchivos();

        return null;
    }

    public void confirmar() {
        if (manager.verificarDetalles(dto)) {
            dto.setFechaConfirmacion(UtilCore.Fecha.obtenerFechaActualDate());
            dto.setUsuarioConfirmacionDto(sessionMBean.getSessionUsuarioDto());
            dto.setEstado(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_CONFIRMADO);
            guardar();
        }
    }

    public void anular() {
        dto.setFechaAnulacion(UtilCore.Fecha.obtenerFechaActualDate());
        dto.setUsuarioAnulacionDto(sessionMBean.getSessionUsuarioDto());
        dto.setEstado(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_ANULADO);
        guardar();
    }

    public void rechazar() {
        dto.setFechaRechazo(UtilCore.Fecha.obtenerFechaActualDate());
        dto.setUsuarioRechazoDto(sessionMBean.getSessionUsuarioDto());
        dto.setEstado(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_RECHAZADO);
        guardar();
    }

    public String cargarPopupRechazar() {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;
        try {
            sistemaControlCompMBean.cargarEncargadosParaPopup(ConstantesComp.ValoresConstantes.SIST_CONTROL_COD_TRANSAC_PEDIDO, ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_RECHAZADO, dto.getId());
            if (sistemaControlCompMBean.getListaDetallesPopup() == null || sistemaControlCompMBean.getListaDetallesPopup().isEmpty()) {
                resultado = false;
                rechazar();
                return manager.getUrl() + "?faces-redirect=true";
            }
        } catch (Exception ex) {
            showError(ex.getMessage());
            logger.error(ex);
        }

        context.addCallbackParam("CallbackParam", resultado);
        return null;
    }

    public String cargarPopupConfirmar() {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;
        try {
            sistemaControlCompMBean.cargarEncargadosParaPopup(ConstantesComp.ValoresConstantes.SIST_CONTROL_COD_TRANSAC_PEDIDO, ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_CONFIRMADO, dto.getId());
            if (sistemaControlCompMBean.getListaDetallesPopup() == null) {
                resultado = false;
            } else if (sistemaControlCompMBean.getListaDetallesPopup().isEmpty()) {
                resultado = false;
                confirmar();
                return manager.getUrl() + "?faces-redirect=true";
            }
        } catch (Exception ex) {
            showError(ex.getMessage());
            logger.error(ex);
        }

        context.addCallbackParam("CallbackParam", resultado);
        return null;
    }
    
    public String cargarPopupAnular() {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;
        try {
            sistemaControlCompMBean.cargarEncargadosParaPopup(ConstantesComp.ValoresConstantes.SIST_CONTROL_COD_TRANSAC_PEDIDO, ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_ANULADO, dto.getId());
            if (sistemaControlCompMBean.getListaDetallesPopup() == null) {
                resultado = false;
            } else if (sistemaControlCompMBean.getListaDetallesPopup().isEmpty()) {
                resultado = false;
                anular();
                return manager.getUrl() + "?faces-redirect=true";
            }
        } catch (Exception ex) {
            showError(ex.getMessage());
            logger.error(ex);
        }

        context.addCallbackParam("CallbackParam", resultado);
        return null;
    }

    
    public void gestionAcceso() {
        this.accesoAnulada = false;
        this.accesoConfirmada = true;
        this.accesoRechazada = false;
        this.accesoGuardar = true;
        if (dto.getId() != null) {
            if (dto.getEstado().equals(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_ELABORACION)) {//Elaborazion
                this.accesoAnulada = true;
                this.accesoConfirmada = true;
                this.accesoRechazada = true;
                this.accesoGuardar = true;
            }else if(dto.getEstado().equals(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_RECHAZADO)){
                this.accesoAnulada = true;
                this.accesoConfirmada = true;
                this.accesoRechazada = false;
                this.accesoGuardar = true;
            }else {
                this.accesoAnulada = false;
                this.accesoConfirmada = false;
                this.accesoRechazada = false;
                this.accesoGuardar = false;
            }

            //Si la accion es = VER
            if (sessionMBean.getAccion() == applicationMBean.getVer()) {
                this.accesoAnulada = false;
                this.accesoConfirmada = false;
                this.accesoRechazada = false;
                this.accesoGuardar = false;
            }
        } else {
            this.accesoConfirmada = false;
        }
    }

    public void cargarPopupBuscarProducto() {
        ProductoMBean productoMBean = (ProductoMBean) WebServletContextListener.getApplicationContext().getBean("productoMBean");
        productoMBean.iniciar();
    }

    public void seleccionarDireccion() {
        dto.setDireccion(terceroDireccionDto.getDireccion());
    }

    public void handleProveedorChange() {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = false;
        BigDecimal descuento = manager.obtenerDescuentoPorProveedor(this.dto.getProveedorDto());
        //this.dto.setDireccion(this.dto.getProveedorDto().getDireccion());
        if (dto.getProveedorDto().getListaDirecciones() != null) {
            if (!dto.getProveedorDto().getListaDirecciones().isEmpty()) {
                List<TerceroDireccionDto> lst = manager.obtenerDireccionesPrincipales(dto.getProveedorDto().getListaDirecciones());
                if (!lst.isEmpty()) {
                    if (lst.size() > 1) {
                        resultado = true;
                    } else if (lst.size() == 1) {
                        dto.setDireccion(lst.get(0).getDireccion());
                    }
                } else {
                    resultado = true;
                }
            }
        }
        if (descuento != null) {
            this.dto.setDescuento(descuento);
            onBlurCalcularSubTotal();
            onBlurCalcularTotal();
        }
        context.addCallbackParam("CallbackParam", resultado);
    }

    public void handleProveedorChangeEnNecesidad() {
        PedidoCompraDto dtoView = listaNecesidadPedido.get(0);
        BigDecimal descuento = manager.obtenerDescuentoPorProveedor(dtoView.getProveedorDto());
        dtoView.setDireccion(dtoView.getProveedorDto().getDireccion());
        if (descuento != null) {
            dtoView.setDescuento(descuento);
            if (dtoView.getSubTotal() != null && dtoView.getDescuento() != null) {
                dtoView.setDescuentoMonto(UtilCore.Numero.dividir(dtoView.getSubTotal().multiply(dtoView.getDescuento()), BigDecimal.valueOf(Long.valueOf("100")), 2));
                dtoView.setSubTotalConDescuento(dtoView.getSubTotal().subtract(dtoView.getDescuentoMonto()));
            }

            if (dtoView.getImpuesto() != null && dtoView.getSubTotalConDescuento() != null) {
                dtoView.setImpuestoMonto(UtilCore.Numero.dividir(dtoView.getSubTotalConDescuento().multiply(dtoView.getImpuesto()), BigDecimal.valueOf(Long.valueOf("100")), 2));
                dtoView.setTotal(dtoView.getSubTotalConDescuento().add(dtoView.getImpuestoMonto()));
                dtoView.setTotalTexto(UtilCore.ConvertirNumeroATexto.convertNumberToLetter(dtoView.getTotal().doubleValue(), dtoView.getMonedaDto().getDescripcionTransac()));
            }
        }
    }

    public void handleMonedaChange() {
        this.dto = manager.recalculardatosPorMoneda(this.dto);
    }

    public void handleProductoChange() {
        manager.unificarDatosPedidoCompraDetalle(detaDto, dto);
    }

    public void onBlurCalcularSubTotaItem() {
        if (detaDto.getCantidad() != null && detaDto.getPrecioUnitarioF() != null) {
            detaDto.setSubTotal(detaDto.getPrecioUnitarioF().multiply(detaDto.getCantidad()));
        }
    }

    public void onBlurCalcularSubTotal() {
        if (dto.getSubTotal() != null && dto.getDescuento() != null) {
            dto.setDescuentoMonto(UtilCore.Numero.dividir(dto.getSubTotal().multiply(dto.getDescuento()), BigDecimal.valueOf(Long.valueOf("100")), 2));
            dto.setSubTotalConDescuento(dto.getSubTotal().subtract(dto.getDescuentoMonto()));
        }
    }

    public void onBlurCalcularTotal() {
        if (dto.getImpuesto() != null && dto.getSubTotalConDescuento() != null) {
            dto.setImpuestoMonto(UtilCore.Numero.dividir(dto.getSubTotalConDescuento().multiply(dto.getImpuesto()), BigDecimal.valueOf(Long.valueOf("100")), 2));
            dto.setTotal(dto.getSubTotalConDescuento().add(dto.getImpuestoMonto()));
            dto.setTotalTexto(UtilCore.ConvertirNumeroATexto.convertNumberToLetter(dto.getTotal().doubleValue(), dto.getMonedaDto().getDescripcionTransac()));
        }
    }

    public void onBlurCalcularMontosItem() {
        if (detaDto.getPrecioUnitarioD() != null && detaDto.getDescuento() != null) {
            detaDto.setDescuentoMonto(UtilCore.Numero.dividir(detaDto.getPrecioUnitarioD().multiply(detaDto.getDescuento()), BigDecimal.valueOf(Long.valueOf("100")), 2));
            detaDto.setPrecioUnitarioF(detaDto.getPrecioUnitarioD().subtract(detaDto.getDescuentoMonto()));
            detaDto.setSubTotal(detaDto.getPrecioUnitarioF().multiply(detaDto.getCantidad()));
        }
    }

    public void buscarSolicitudes() {
        try {
            this.listaSolicitudes = this.solicitudCompraManager.obtenerConfirmadas(this.dtoSolicFiltro);
        } catch (DAOException ex) {
            showError("ERROR_SISTEMA", ex.getMessage());
        }
    }

    public String generarPedidoCompra() {
        sessionMBean.setAccion(applicationMBean.getNuevo());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyEntidad, sessionMBean.getAccion()));
        this.dto = manager.generarDatosPedidoCompra(solicitudCompraDto);
        this.detaDto = this.pedidoCompraDetaManager.inicializar();
        this.urlInvocador = manager.getUrlListaSolicitudes();
        gestionAcceso();
        return manager.getUrl();
    }

    private void generarExcelSeleccionadosPedidoCompra() {
        this.manager.generarExcelSeleccionados(pcExcel, selectedPCs);
    }

    private void generarExcelPorTablaPedidoCompra() {
        this.manager.generarExcelPorTabla(pcExcel, lista);
    }

    public void exportarExcel() {
        if (this.tipoXls.equals("T")) {
            generarExcelPorTablaPedidoCompra();
        } else if (this.tipoXls.equals("S")) {
            generarExcelSeleccionadosPedidoCompra();
        }
    }

    public void cargarPopupExportarExcel(String tipo) {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;
        this.tipoXls = tipo;
        if (tipo.equals("T")) {
            if (lista.isEmpty()) {
                resultado = false;
                this.recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("mensaje.selecc.pedido.compra"));
            }
        } else if (tipo.equals("S")) {

            if (selectedPCs.length <= 0) {
                resultado = false;
                this.recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("mensaje.selecc.pedido.compra"));
            }

        }
        if (resultado) {
            this.pcExcel = new ExportarExcelCompras.PedidoCompra(true);
            this.checkExcel = Boolean.TRUE;
        }
        context.addCallbackParam("CallbackParam", resultado);
    }

    public void onChangeChekExcel() {
        this.pcExcel = manager.onChangeChekExcel(checkExcel);
    }

    public String retroceder() {
        if (this.urlInvocador.equals(manager.getUrlLista())) {
            System.out.println("RETROCEDER");
            buscar();
        } else if (this.urlInvocador.equals(manager.getUrlListaSolicitudes())) {
            buscarSolicitudes();
        }
        return this.urlInvocador;
    }

    public String retrocederListaGeneral() {
        return manager.getUrlLista();
    }

    //Metodos para Necesidad a Pedido
    public void seleccionaProducto() {
        this.dtoSolicDetaFiltro.setIdProducto(productoDetaDto.getId());
        this.dtoSolicDetaFiltro.setDescProducto(productoDetaDto.getProductoDto().getDescripcion());
    }

    public void anadirItems() {
        this.listaNecesidadPedido = manager.anadirItems(listaNecesidadPedido, selectedSolCompraDetaDto);
        this.listaItemsSolicitudCompra = manager.quitarItemsYaSeleccionados(this.listaItemsSolicitudCompra, listaNecesidadPedido);
    }

    public void quitarItem(PedidoCompraDetaDto pcdDto) {
        this.listaNecesidadPedido = manager.quitarItem(this.listaNecesidadPedido, pcdDto, contIndex);
    }

    public void cargarPopupWizard() {
        this.listaNecesidadPedido = manager.generarNumPCTexto(this.listaNecesidadPedido);
        this.listaNecesidadPedido = manager.obtenerDescuentosPorProveedor(this.listaNecesidadPedido);
    }

    public void guardarPedidosCompra() {
        RequestContext context = RequestContext.getCurrentInstance();
        Boolean resultado = manager.guardarPedidosCompra(this.listaNecesidadPedido);
        if (resultado) {
            this.listaItemsSolicitudCompra = new ArrayList<SolicitudCompraDetaDto>();
            this.selectedSolCompraDetaDto = null;
            this.listaNecesidadPedido = new ArrayList<PedidoCompraDto>();
        }
        context.addCallbackParam("CallbackParam", resultado);
    }

    public void verInfoSolicitudCompra() {
        this.listaItemsSolicitudCompra = new ArrayList<SolicitudCompraDetaDto>();
        if (this.detaDto.getSolicitudCompraDetaDto() != null) {
            this.listaItemsSolicitudCompra.add(this.detaDto.getSolicitudCompraDetaDto());
        } else {
            for (PcDetaItemDto x : this.detaDto.getListaDetalles()) {
                this.listaItemsSolicitudCompra.add(x.getSolicitudCompraDetaDto());
            }
        }
    }

    public void visualizarOrigen() {
        SolicitudCompraMBean solicitudCompraMBean = (SolicitudCompraMBean) WebServletContextListener.getApplicationContext().getBean("solicitudCompraMBean");
        solicitudCompraMBean.cargarDatosInfo(dto.getSolicitudCompraDto().getId());
    }

    public void cargarDatosInfo(Long id) {
        try {
            this.infoDto = this.manager.obtenerPorId(id);
        } catch (DAOException ex) {
            recursosManager.showError(ex.getMessage());
            logger.error(ex.getMessage());
        }
    }

    public void verCotizacionesProveedores() {
        try {
            this.cotDto = this.cotizacionManager.inicializar();
            this.cotDto.setEstado(ConstantesComp.ValoresConstantes.COT_PROVEEDORES_COD_ESTADO_CONFIRMADO);
            this.listaCotizaciones = this.cotizacionManager.obtenerCotizacionesConfirmadas(this.cotDto);
        } catch (Exception ex) {
            logger.error(ex.getMessage());
        }
    }

    public void visualizarCotDeta(CotizacionProveedoresDto dto) {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = false;

        try {
            this.listaDetaCotDto = dto.getListaCotizacionProveedoresDeta();
            resultado = true;
        } catch (Exception e) {
            logger.error(e.getMessage());
        }
        context.addCallbackParam("CallbackParam", resultado);
    }

    public void listaDocumentosCompra() throws DAOException {
        try {
            listaDC = this.dcManager.obtenerDocCompraPorPedidoCompra(this.dto);
        } catch (Exception e) {
            logger.error(e.getMessage());
        }
    }

    public void verDetalleInfoDC() throws DAOException {
        try {
            this.dcDtoPopup = this.dcManager.obtenerPorId(this.dcDto.getId());
        } catch (Exception e) {
            logger.error(e.getMessage());
        }
    }

    public String imprimirDto() {
        this.manager.imprimirDto(dto);
        return "";
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        PedidoCompraMBean.logger = logger;
    }

    public PedidoCompraManager getManager() {
        return manager;
    }

    public void setManager(PedidoCompraManager manager) {
        this.manager = manager;
    }

    public BitacoraManager getBitacoraManager() {
        return bitacoraManager;
    }

    public void setBitacoraManager(BitacoraManager bitacoraManager) {
        this.bitacoraManager = bitacoraManager;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public ApplicationMBean getApplicationMBean() {
        return applicationMBean;
    }

    public void setApplicationMBean(ApplicationMBean applicationMBean) {
        this.applicationMBean = applicationMBean;
    }

    public SessionMBean getSessionMBean() {
        return sessionMBean;
    }

    public void setSessionMBean(SessionMBean sessionMBean) {
        this.sessionMBean = sessionMBean;
    }

    public List<PedidoCompraDto> getLista() {
        return lista;
    }

    public void setLista(List<PedidoCompraDto> lista) {
        this.lista = lista;
    }

    public PedidoCompraDto getDto() {
        return dto;
    }

    public void setDto(PedidoCompraDto dto) {
        this.dto = dto;
    }

    public PedidoCompraDto getDtoFiltro() {
        return dtoFiltro;
    }

    public void setDtoFiltro(PedidoCompraDto dtoFiltro) {
        this.dtoFiltro = dtoFiltro;
    }

    public String getKeyEntidad() {
        return keyEntidad;
    }

    public void setKeyEntidad(String keyEntidad) {
        this.keyEntidad = keyEntidad;
    }

    public PedidoCompraDetaDto getUbicacionDto() {
        return detaDto;
    }

    public void setUbicacionDto(PedidoCompraDetaDto ubicacionDto) {
        this.detaDto = ubicacionDto;
    }

    public String getTituloDetalle() {
        return tituloDetalle;
    }

    public void setTituloDetalle(String tituloDetalle) {
        this.tituloDetalle = tituloDetalle;
    }

    public SelectItem[] getSiEstadosFiltro() {
        siEstadosFiltro = manager.siTiposPedidoCompraTodos();
        return siEstadosFiltro;
    }

    public void setSiEstadosFiltro(SelectItem[] siEstadosFiltro) {
        this.siEstadosFiltro = siEstadosFiltro;
    }

    public PedidoCompraDetaDto getDetaDto() {
        return detaDto;
    }

    public void setDetaDto(PedidoCompraDetaDto detaDto) {
        this.detaDto = detaDto;
    }

    public Date getFechaActual() {
        return UtilCore.Fecha.obtenerFechaActualDate();
    }

    public void setFechaActual(Date fechaActual) {
        this.fechaActual = fechaActual;
    }

    public List<TarifaDto> getListaTarifas() throws DAOException {
        listaTarifas = tarifaManager.obtenerActivosPorOrganizacion();
        return listaTarifas;
    }

    public void setListaTarifas(List<TarifaDto> listaTarifas) {
        this.listaTarifas = listaTarifas;
    }

    public List<UnidadMedidaDto> getListaUnidadMedida() throws DAOException {
        listaUnidadMedida = umManager.obtenerTodosActivos();
        return listaUnidadMedida;
    }

    public void setListaUnidadMedida(List<UnidadMedidaDto> listaUnidadMedida) {
        this.listaUnidadMedida = listaUnidadMedida;
    }

    public boolean isAccesoAnulada() {
        return accesoAnulada;
    }

    public void setAccesoAnulada(boolean accesoAnulada) {
        this.accesoAnulada = accesoAnulada;
    }

    public boolean isAccesoConfirmada() {
        return accesoConfirmada;
    }

    public void setAccesoConfirmada(boolean accesoConfirmada) {
        this.accesoConfirmada = accesoConfirmada;
    }

    public boolean isAccesoRechazada() {
        return accesoRechazada;
    }

    public void setAccesoRechazada(boolean accesoRechazada) {
        this.accesoRechazada = accesoRechazada;
    }

    public boolean isAccesoGuardar() {
        return accesoGuardar;
    }

    public void setAccesoGuardar(boolean accesoGuardar) {
        this.accesoGuardar = accesoGuardar;
    }

    public List<MonedaDto> getListaMonedas() throws DAOException {
        listaMonedas = monedaManager.obtenerMonedasActivasPorEmpresa();
        return listaMonedas;
    }

    public void setListaMonedas(List<MonedaDto> listaMonedas) {
        this.listaMonedas = listaMonedas;
    }

    public List<SolicitudCompraDto> getListaSolicitudes() {
        return listaSolicitudes;
    }

    public void setListaSolicitudes(List<SolicitudCompraDto> listaSolicitudes) {
        this.listaSolicitudes = listaSolicitudes;
    }

    public SolicitudCompraDto getDtoSolicFiltro() {
        return dtoSolicFiltro;
    }

    public void setDtoSolicFiltro(SolicitudCompraDto dtoSolicFiltro) {
        this.dtoSolicFiltro = dtoSolicFiltro;
    }

    public SolicitudCompraDto getSolicitudCompraDto() {
        return solicitudCompraDto;
    }

    public void setSolicitudCompraDto(SolicitudCompraDto solicitudCompraDto) {
        this.solicitudCompraDto = solicitudCompraDto;
    }

    public SelectItem[] getSiDocTransaccion() {
        return manager.siDocTransaccion();
    }

    public void setSiDocTransaccion(SelectItem[] siDocTransaccion) {
        this.siDocTransaccion = siDocTransaccion;
    }

    public List<AlmacenDto> getListaAlmacenes() throws DAOException {
        AlmacenManager almacenManager = (AlmacenManager) WebServletContextListener.getApplicationContext().getBean("almacenManager");
        listaAlmacenes = almacenManager.obtenerAlmacenesActivosPorOrganizacion();
        return listaAlmacenes;
    }

    public void setListaAlmacenes(List<AlmacenDto> listaAlmacenes) {
        this.listaAlmacenes = listaAlmacenes;
    }

    public List<ParametroDto> getListaFormaPago() {
        return this.recursosManager.obtenerParametrosActivosPorCatalogoSistema(ConstantesComp.CatalogoParametro.FORMA_PAGO);
    }

    public void setListaFormaPago(List<ParametroDto> listaFormaPago) {
        this.listaFormaPago = listaFormaPago;
    }

    public List<CondicionPagoDto> getListaCondicionPago() throws DAOException {
        CondicionPagoManager condicionPagoManager = (CondicionPagoManager) WebServletContextListener.getApplicationContext().getBean("condicionPagoManager");
        listaCondicionPago = condicionPagoManager.obtenerActivosPorEmpresa();
        return listaCondicionPago;
    }

    public void setListaCondicionPago(List<CondicionPagoDto> listaCondicionPago) {
        this.listaCondicionPago = listaCondicionPago;
    }

    public Integer getContIndex() {
        return contIndex;
    }

    public void setContIndex(Integer contIndex) {
        this.contIndex = contIndex;
    }

    public List<SolicitudCompraDetaDto> getListaItemsSolicitudCompra() {
        return listaItemsSolicitudCompra;
    }

    public void setListaItemsSolicitudCompra(List<SolicitudCompraDetaDto> listaItemsSolicitudCompra) {
        this.listaItemsSolicitudCompra = listaItemsSolicitudCompra;
    }

    public SolicitudCompraDetaDto getDtoSolicDetaFiltro() {
        return dtoSolicDetaFiltro;
    }

    public void setDtoSolicDetaFiltro(SolicitudCompraDetaDto dtoSolicDetaFiltro) {
        this.dtoSolicDetaFiltro = dtoSolicDetaFiltro;
    }

    public SolicitudCompraDetaDto[] getSelectedSolCompraDetaDto() {
        return selectedSolCompraDetaDto;
    }

    public void setSelectedSolCompraDetaDto(SolicitudCompraDetaDto[] selectedSolCompraDetaDto) {
        this.selectedSolCompraDetaDto = selectedSolCompraDetaDto;
    }

    public ProductoDto getProductoDto() {
        return productoDto;
    }

    public void setProductoDto(ProductoDto productoDto) {
        this.productoDto = productoDto;
    }

    public List<PedidoCompraDto> getListaNecesidadPedido() {
        return listaNecesidadPedido;
    }

    public void setListaNecesidadPedido(List<PedidoCompraDto> listaNecesidadPedido) {
        this.listaNecesidadPedido = listaNecesidadPedido;
    }

    public SolicitudCompraDetaDto getSolCompraDetaDto() {
        return solCompraDetaDto;
    }

    public void setSolCompraDetaDto(SolicitudCompraDetaDto solCompraDetaDto) {
        this.solCompraDetaDto = solCompraDetaDto;
    }

    public List<PedidoCompraDto> getListaPopup() {
        return listaPopup;
    }

    public void setListaPopup(List<PedidoCompraDto> listaPopup) {
        this.listaPopup = listaPopup;
    }

    public PedidoCompraDto getDtoFiltroPopup() {
        return dtoFiltroPopup;
    }

    public void setDtoFiltroPopup(PedidoCompraDto dtoFiltroPopup) {
        this.dtoFiltroPopup = dtoFiltroPopup;
    }

    public PedidoCompra getPcExcel() {
        return pcExcel;
    }

    public void setPcExcel(PedidoCompra pcExcel) {
        this.pcExcel = pcExcel;
    }

    public PedidoCompraDto[] getSelectedPCs() {
        return selectedPCs;
    }

    public void setSelectedPCs(PedidoCompraDto[] selectedPCs) {
        this.selectedPCs = selectedPCs;
    }

    public Boolean getCheckExcel() {
        return checkExcel;
    }

    public void setCheckExcel(Boolean checkExcel) {
        this.checkExcel = checkExcel;
    }

    public OrganizacionManager getOrganizacionManager() {
        return organizacionManager;
    }

    public void setOrganizacionManager(OrganizacionManager organizacionManager) {
        this.organizacionManager = organizacionManager;
    }

    public PedidoCompraDetaManager getPedidoCompraDetaManager() {
        return pedidoCompraDetaManager;
    }

    public void setPedidoCompraDetaManager(PedidoCompraDetaManager pedidoCompraDetaManager) {
        this.pedidoCompraDetaManager = pedidoCompraDetaManager;
    }

    public ArchivoMBean getArchivoMBean() {
        return archivoMBean;
    }

    public void setArchivoMBean(ArchivoMBean archivoMBean) {
        this.archivoMBean = archivoMBean;
    }

    public UnidadMedidaManager getUmManager() {
        return umManager;
    }

    public void setUmManager(UnidadMedidaManager umManager) {
        this.umManager = umManager;
    }

    public TarifaManager getTarifaManager() {
        return tarifaManager;
    }

    public void setTarifaManager(TarifaManager tarifaManager) {
        this.tarifaManager = tarifaManager;
    }

    public SolicitudCompraDetaManager getSolicitudCompraDetaManager() {
        return solicitudCompraDetaManager;
    }

    public void setSolicitudCompraDetaManager(SolicitudCompraDetaManager solicitudCompraDetaManager) {
        this.solicitudCompraDetaManager = solicitudCompraDetaManager;
    }

    public SolicitudCompraManager getSolicitudCompraManager() {
        return solicitudCompraManager;
    }

    public void setSolicitudCompraManager(SolicitudCompraManager solicitudCompraManager) {
        this.solicitudCompraManager = solicitudCompraManager;
    }

    public MonedaManager getMonedaManager() {
        return monedaManager;
    }

    public void setMonedaManager(MonedaManager monedaManager) {
        this.monedaManager = monedaManager;
    }

    public String getKeyDetalleEntidad() {
        return keyDetalleEntidad;
    }

    public void setKeyDetalleEntidad(String keyDetalleEntidad) {
        this.keyDetalleEntidad = keyDetalleEntidad;
    }

    public String getUrlInvocador() {
        return urlInvocador;
    }

    public void setUrlInvocador(String urlInvocador) {
        this.urlInvocador = urlInvocador;
    }

    public PedidoCompraDto getInfoDto() {
        return infoDto;
    }

    public void setInfoDto(PedidoCompraDto infoDto) {
        this.infoDto = infoDto;
    }

    public String getTipoXls() {
        return tipoXls;
    }

    public void setTipoXls(String tipoXls) {
        this.tipoXls = tipoXls;
    }

    public ProductoDetaDto getProductoDetaDto() {
        return productoDetaDto;
    }

    public void setProductoDetaDto(ProductoDetaDto productoDetaDto) {
        this.productoDetaDto = productoDetaDto;
    }

    public TerceroDireccionDto getTerceroDireccionDto() {
        return terceroDireccionDto;
    }

    public void setTerceroDireccionDto(TerceroDireccionDto terceroDireccionDto) {
        this.terceroDireccionDto = terceroDireccionDto;
    }

    public CotizacionProveedoresManager getCotizacionManager() {
        return cotizacionManager;
    }

    public void setCotizacionManager(CotizacionProveedoresManager cotizacionManager) {
        this.cotizacionManager = cotizacionManager;
    }

    public List<CotizacionProveedoresDto> getListaCotizaciones() {
        return listaCotizaciones;
    }

    public void setListaCotizaciones(List<CotizacionProveedoresDto> listaCotizaciones) {
        this.listaCotizaciones = listaCotizaciones;
    }

    public CotizacionProveedoresDetaManager getCotDetaManager() {
        return cotDetaManager;
    }

    public void setCotDetaManager(CotizacionProveedoresDetaManager cotDetaManager) {
        this.cotDetaManager = cotDetaManager;
    }

    public List<CotizacionProveedoresDetaDto> getListaDetaCotDto() {
        return listaDetaCotDto;
    }

    public void setListaDetaCotDto(List<CotizacionProveedoresDetaDto> listaDetaCotDto) {
        this.listaDetaCotDto = listaDetaCotDto;
    }

    public CotizacionProveedoresDto getCotDto() {
        return cotDto;
    }

    public void setCotDto(CotizacionProveedoresDto cotDto) {
        this.cotDto = cotDto;
    }

    public DocumentoCompraManager getDcManager() {
        return dcManager;
    }

    public void setDcManager(DocumentoCompraManager dcManager) {
        this.dcManager = dcManager;
    }

    public List<DocumentoCompraDto> getListaDC() {
        return listaDC;
    }

    public void setListaDC(List<DocumentoCompraDto> listaDC) {
        this.listaDC = listaDC;
    }

    public DocumentoCompraDto getDcDto() {
        return dcDto;
    }

    public void setDcDto(DocumentoCompraDto dcDto) {
        this.dcDto = dcDto;
    }

    public DocumentoCompraDto getDcDtoPopup() {
        return dcDtoPopup;
    }

    public void setDcDtoPopup(DocumentoCompraDto dcDtoPopup) {
        this.dcDtoPopup = dcDtoPopup;
    }

    public List<CentroCostosDto> getListaCentroCostos() throws DAOException {
        CentroCostosManager centroCostosManager = (CentroCostosManager) WebServletContextListener.getApplicationContext().getBean("centroCostosManager");
        return centroCostosManager.obtenerPorOrganizacion();
    }

    public void setListaCentroCostos(List<CentroCostosDto> listaCentroCostos) {
        this.listaCentroCostos = listaCentroCostos;
    }
}
